class ArrayList {
    data: Array<number> = [];
    constructor(...arr: Array<number>) {
        this.data = arr;
    };
    //添加数字
    add(ele: number): void {
        this.data.push(ele)
    };
    //打印所有元素
    toString(): string {
        return this.data.join('-')
    };
    //交换位置（es6写法）
    exchange(x: number, y: number) {
        [this.data[x], this.data[y]] = [this.data[y], this.data[x]]
    };
    //冒泡排序
    bubbleSort(): Array<number> {
        //每次循环，最大的数都会往右边靠
        for (let i = this.data.length - 1; i > 0; i--) {
            for (let j = 0; j < this.data.length - 1; j++) {
                //比较当前元素和后一个元素大小 如何为true则交换位置，否则不变
                if (this.data[j] > this.data[j + 1]) {
                    //交换值
                    this.exchange(j, j + 1);
                }
            }
        }
        return this.data;
    };
    //选择排序
    selectSort() {
        for (let i = 0; i < this.data.length - 1; i++) {
            //假设最小值的索引
            let indexMin: number = i;
            //假设的最小值与剩余索引位数的值做比较
            for (let j = i + 1; j < this.data.length; j++) {
                //为true时
                if (this.data[indexMin] > this.data[j]) {
                    //更改最小值索引
                    indexMin = j
                }
            }
            //交换值
            this.exchange(i, indexMin);
        }
    };
    //插入排序
    insertSort() {
        //从数组第二开始向前一个元素比较
        for (let i = 1; i < this.data.length; i++) {
            //设置当前元素的位置
            let starIndex: number = i;
            //比较当前元素和前一个元素的大小，如果前前面还有元素则继续比较，当前一个元素小于当前元素时则重新循环上一层
            while (this.data[starIndex] < this.data[starIndex - 1] && starIndex > 0) {
                //交换值
                this.exchange(starIndex, starIndex - 1);
                //当前元素的位置向前移一位
                starIndex--;
            }
        }
    }
}
const arr = new ArrayList(13, 10, 0, 34, 67, 2, 1, 100, 34, 23, 46, 35);
arr.insertSort();
console.log(arr.toString());